#!/usr/bin/env python
# -*- coding:utf-8 -*-

# https://blog.csdn.net/u011878611/article/details/103996605
# 如果使用 ttk.Scale 组件，则更接近操作系统本地的效果，但允许定制的选项少。
# ttk.LabeledScale 是平台化的滑动条，因此它允许设置的选项很少，
# 只能设置 from、to 和 compound 等有限的几个选项，而且它总是生成一个水平滑动条（不能变成垂直的），
# 其中 compound 选项控制滑动条的数值标签是显示在滑动条的上方，还是滑动条的下方。

from tkinter import *
from tkinter import ttk


def main():
    root = Tk()
    root.resizable(0, 0)

    def change(value):
        print(value, scale.get(), doubleVar.get())

    '''获取 Scale 值
    1.通过事件处理方法的参数来获取。
    2.通过 Scale 组件提供的 get() 方法来获取。
    3.通过 Scale 组件绑定的变量来获取。
    '''

    doubleVar = DoubleVar()
    scale = Scale(root,
                  from_=-100,  # 设置最大值
                  to=100,  # 设置最小值
                  resolution=5,  # 设置步长
                  label='Sacle:',  # 设置标签内容

                  length=400,  # 设置轨道的长度
                  width=30,  # 设置轨道的宽度
                  troughcolor='lightblue',  # 设置轨道的背景色

                  sliderlength=20,  # 设置滑块的长度
                  sliderrelief=SUNKEN,  # 设置滑块的立体样式

                  showvalue=YES,  # 设置显示当前值
                  orient=HORIZONTAL,  # 设置水平方向
                  digits=5,  # 设置十位有效数字
                  command=change,  # 绑定事件处理函数
                  variable=doubleVar  # 绑定变量
                  )
    scale.pack()
    scale.set(20)

    f = Frame(root)
    f.pack(fill=X, expand=YES, padx=10)

    def valueshow():
        scale['showvalue'] = showVar.get()

    Label(f, text='是否显示值:').pack(side=LEFT)

    showVar = IntVar()
    i = 0
    for s in ('不显示', '显示'):
        Radiobutton(f, text=s, value=i, variable=showVar, command=valueshow).pack(side=LEFT)
        i += 1
    showVar.set(1)

    f = Frame(root)
    f.pack(fill=X, expand=YES, padx=10)

    def scaleorient():
        scale['orient'] = VERTICAL if orientVar.get() else HORIZONTAL

    Label(f, text='方向:').pack(side=LEFT)

    orientVar = IntVar()
    i = 0
    for direction in ('水平', '垂直'):
        Radiobutton(f, text=direction, value=i, variable=orientVar, command=scaleorient).pack(side=LEFT)
        i += 1
    orientVar.set(0)

    # 设置LabeledScale控件
    f = Frame(root)
    f.pack(fill=X, expand=YES, padx=10)
    Label(f, text='LabeledScale:').pack(anchor=NW)
    labeledscale = ttk.LabeledScale(f,
                                    from_=-100,  # 设置最大值
                                    to=100,  # 设置最小值
                                    compound=BOTTOM  # 显示数值在滑动条下方
                                    )
    labeledscale.value = -20
    labeledscale.pack(fill=X, expand=YES)

    mainloop()


if __name__ == "__main__":
    main()
